iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0

每天的專案會同步到 GitLab 上,可以前往 GitLab 查看。
有興趣的朋友歡迎留言 or 來信討論,我的信箱是 nickchen1998@gmail.com

什麼是 Embedding?

Embedding 是一種將複雜數據轉換為低維度向量的技術,這種技術常用於自然語言處理(NLP)、推薦系統、圖像辨識等等各種常見的領域。
Embedding 的目的是將高維度或稀疏的數據表示(例如文字、圖片、用戶行為等)映射到一個低維度的向量空間中,使得具有相似特徵的數據在這個空間中距離較近。
換句話說,Embedding 是一種將物體(例如單詞、句子、圖片等)表示為一組固定大小的數字向量的方式,而這些向量通常包含了物體之間的某些關聯資訊。

以 "文字" 為例

在自然語言處理中,單字通常是以詞嵌入的形式表示。假設我們有三個單詞:“貓”、“狗”和“蘋果”。這些單字在文字型態下是無法直接進行數學運算的。
但我們可以將這些單詞轉換為向量,比如:

“貓” → [0.1, 0.3, 0.7]

“狗” → [0.2, 0.4, 0.8]

“蘋果” → [0.9, 0.1, 0.1]

這些向量之間的距離可以表示單詞之間的相似度,例如“貓”和“狗”是動物,向量的距離較近,而“蘋果”是一種水果,與前兩個詞距離較遠。

OpenAI 的 Embedding

上面我們簡單介紹了一下 Embedding 的概念,接下來我們來看一下該麼透過 OpenAI 的 API 來取得 Embedding:

import requests
from env_settings import EnvSettings

env_settings = EnvSettings()
embedding_url = "https://api.openai.com/v1/embeddings"
headers = {
    "Authorization": f"Bearer {env_settings.OPENAI_API_KEY}",
    "Content-Type": "application/json"
}

statement = "I am happy"
response = requests.post(
    embedding_url,
    headers=headers,
    json={
        "input": statement,
        "model": "text-embedding-ada-002",
        "encoding_format": "float"
    }
)
print(response.json())

在上面的程式碼當中,我們試著直接使用 requests 請求 OpenAI 的 API 來取得 Embedding,
下圖中可以看到執行這段程式碼後,我們可以取得 I am happy 這句話的 Embedding:

embedding

LangChain 中的 Embedding

而在 LangChain 當中,同樣也幫我們封裝好各大語言模型的 Embedding 方法,讓我們可以直接使用,讓我們看一下下面的範例:

from env_settings import EnvSettings
from langchain_openai.embeddings import OpenAIEmbeddings

env_settings = EnvSettings()
embedding = OpenAIEmbeddings(
    openai_api_key=env_settings.OPENAI_API_KEY
)
print(embedding.embed_query("I am happy"))

可以看到,透過 LangChain 替我們封裝好的方法,可以讓我們的程式碼更加簡潔,並且可以直接取得 Embedding 的結果。

langchain embedding

我們可以把這次產生出的 embedding 的結果跟上一張圖片對比,可以發現,同樣的一段句子產生出來的向量會是一樣的,表示語意完全一樣。

向量資料庫 Pinecone

接著我們要把句子算出來的 embedding 存進向量資料庫,這次鐵人賽我們選擇 Pinecone 作為我們的向量資料庫,原因是他有提供免費的線上方案,
可以省去我們在本地部屬的時間,且使用上的難易度較低,LangChain 本身也有寫好的方法可以用,降低我們的開發成本,下面我們就帶大家來快速了解一下如何進行操作:

於 Pinecone 中 index 的概念類似於 SQL 中的一個 database。

  • 註冊 Pinecone 帳號:前往官網點選註冊,填寫基本資料即可。點我前往

  • 進到主控台後,選擇 Create Index

    create index

  • 輸入基本資訊,並選擇服務提供商。

    select info

  • 點選利用模型選擇維度,並選擇 OpenAI

    select embedding model

  • 跳轉回建立完成的頁面,可以看到我們成功建立一組 index。

    create index done

插入向量

接著我們就要來透過 LangChain 協助我們插入文本的向量到 Pinecone 的資料庫中,讓我們看一下下面的範例:

pip install pinecone
pip install langchain-pinecone

請記得安裝上面兩個套件

from env_settings import EnvSettings
from langchain_openai.embeddings import OpenAIEmbeddings
from langchain_pinecone import PineconeVectorStore
from langchain_core.documents import Document
from pinecone import Pinecone

env_settings = EnvSettings()
embedding = OpenAIEmbeddings(
    openai_api_key=env_settings.OPENAI_API_KEY
)
vector_store = PineconeVectorStore(
    index=Pinecone(api_key=env_settings.PINECONE_API_KEY).Index("ithelp"),
    embedding=embedding
)

document = Document(page_content="I am happy.")
result = vector_store.add_documents([document])
print(result)

透過上面的程式碼,我們可以將 I am happy. 這句話的 Embedding 存進 Pinecone 的資料庫中,讓我們可以透過這個向量來進行搜尋,
至於透過 print 印出來後的結果,則是存進向量資料庫後,每個 document 所回傳 id,類似於資料庫的 primary key。

document id

最後我們回到 Pinecone 的主控台,可以看到我們剛剛存進去的向量資料:

insert data

這樣我們就成功地把我們的文本轉換成向量,並且存進向量資料庫了!

內容預告

今天我們介紹了 embedding 以及用來存放 embedding 的向量資料庫,明天我們要來介紹一下 RAG 這個觀念。


上一篇
Day 07 - LangChain 中的 Chain
下一篇
Day 09 - RAG 介紹
系列文
初探 Langchain 與 LLM:打造簡易問診機器人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言